package store.lunangangster.nodeflow.rt.element;

import cn.hutool.core.collection.CollUtil;
import java.util.List;
import store.lunangangster.nodeflow.builder.ChainBuilder;
import store.lunangangster.nodeflow.rt.FlowBus;
import store.lunangangster.nodeflow.rt.Slot;
import store.lunangangster.nodeflow.rt.element.flow.Flow;

/**
 * <p>流程链的可执行类</p>
 * <p>一个&lt;chain/&gt;的定义就对应于一个Chain对象</p>
 *
 * @author cwk
 * @version 1.0
 */
public class Chain implements Executable, Identifiable<String> {

	private String id;

	/**
	 * 一个Chain中所有的可执行流。可执行流的定义见{@link Flow}
	 */
	private List<Flow> flowList;

	/**
	 * 一个空的构造函数，并不建议使用该构造函数来构造Chain对象，用户也不应该自己尝试去
	 * 创建一个Chain。应该使用{@link ChainBuilder}来构建Chain，并且调用{@link ChainBuilder#build()}方法向{@link FlowBus}中加入一个Chain
	 */
	public Chain() {
	}

	private Chain(String id, List<Flow> flowList) {
		this.id = id;
		this.flowList = flowList;
	}

	/**
	 * 创建一个仅包含id的空Chain
	 * @param id	chainId
	 * @return		emptyChain
	 */
	public static Chain emptyChain(String id) {
		return new Chain(id, null);
	}

	/**
	 * Chain的执行方法
	 * @param slotIndex	被分配的{@link Slot}下标
	 */
	@Override
	public void execute(Integer slotIndex) {
		if (CollUtil.isEmpty(flowList)) {
			return;
		}
		flowList.forEach(flow -> flow.execute(slotIndex));
	}

	/**
	 * 获取当前对象的id
	 * @return  id
	 */
	@Override
	public String getId() {
		return id;
	}

	/**
	 * 设置当前对象的id
	 * @param id	chainId
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * 获取当前Chain的执行流集合
	 * @return	执行流集合
	 */
	public List<Flow> getFlowList() {
		return flowList;
	}

	/**
	 * 设置当前Chain的执行流集合
	 * @param flowList	执行流集合
	 */
	public void setFlowList(List<Flow> flowList) {
		this.flowList = flowList;
	}
}
